/**
 * Copyright (C) 2020 Baidu, Inc. All Rights Reserved.
 */
package com.baidu.mpks.backendweb.source.service;

import com.baidu.mpks.common.dto.ListDto;
import com.baidu.mpks.datasource.domain.Source;
import com.baidu.mpks.datasource.domain.StructInfo;
import com.baidu.mpks.user.domain.User;
import lombok.Data;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @author cuixuefei
 */
public interface SourceService {

    @Data
    public class SearchCriteria {

        private String contentType; // 数据类型
        private List<String> inputTypes; // 数据类型
        private String wd; // 搜索关键词
        private String userId; // 搜索操作人
        private Long beginTime; // 开始时间
        private Long endTime; // 结束时间
        private Integer nodeId; // 节点树
        private int pageNumber; // 第几页，从1开始计算
        private int pageSize; // 每一页的数量
        private List<String> docTypes; // 文件类型

        public SearchCriteria() {
            setPageSize(20);
            setPageNumber(1);
        }
    }

    /**
     * @param nodeId
     * @param inputTypes
     * @param contentTypes
     * @param pageSize
     * @param pageNumber
     * @return
     */
    ListDto<Source> searchSource(Integer nodeId, List<String> inputTypes, List<String> contentTypes,
                                 Integer pageSize,
                                 Integer pageNumber);

    /**
     * @return
     */
    String getToken();

    /**
     * @param source
     * @throws IOException
     */
    void addSource(Source source) throws IOException;

    /**
     * @param source
     * @throws IOException
     */
    void updateSource(Source source) throws IOException;

    /**
     * @param sc
     * @return
     */
    Map<String, Object> getListFromMongo(SearchCriteria sc);

    Map<String, Object> getListFromMySql(SearchCriteria sc, String type);

    /**
     * @param source
     * @throws IOException
     */
    void deleteSource(Source source) throws IOException;

    Long getStructTypeTotalFromMongo(String name, Integer sourceId);

    /**
     * @param sc
     * @return
     */
    Map<String, Object> getStructList(SearchCriteria sc);

    /**
     * @param structInfo
     */
    void addStructData(StructInfo structInfo);

    /**
     * @param oriClassName
     * @param action
     * @param sourceId
     */
    void saveClass(List<String> oriClassName, String action, Integer sourceId);

    /**
     * @param sourceId
     */
    void deleteStructData(Integer sourceId);

    /**
     * @param contentTypeList
     * @param sourceId
     * @return
     */
    Long countMongoBySourceId(List<String> contentTypeList, List<Integer> sourceId);

    /**
     * 获取文档数据用于批量生产
     *
     * @param sourceId
     * @return
     */
    List<Map> getFileDataFromMongoBySourceId(List<Integer> sourceId);

    /**
     * 获取apipush的结构化数据用于批量生产
     *
     * @param sourceId
     * @param updateTimeL
     * @return
     */
    List<Map> getSturctApiPushDataFromMongoBySourceId(List<Integer> sourceId, long updateTimeL);

    /**
     * 将数据推送到资源kafka
     *
     * @param data
     *
     * @throws IOException
     */
    String pushToSource(Object data, String token) throws IOException;

    /**
     * 将数据推送到数据源kafka的post方法
     *
     * @param data
     * @throws IOException
     */
    void pushToDataSource(Map<String, Object> data) throws IOException;

    /**
     * 更新结构化数据统计表和结构化资源的状态
     *
     * @param structInfoList
     * @param sourceId
     */
    void saveStructDataTotalAndStatus(List<StructInfo> structInfoList, Integer sourceId);

    /**
     * 数据回放：获取对应的mongo表中，sourceId相关的资源，推送到datasource的kafka中 因为现在流式的数据都是存储在mongo中的
     *
     * @param sourceId
     * @param dataSourceId
     * @param dataSourceName
     * @param contentType 资源类型
     * @param startTime       开始时间
     * @param endTime         结束时间
     */
    void sendToDataSource(List<Integer> sourceId, Integer dataSourceId, String dataSourceName,
                          String contentType, Long startTime, Long endTime);

    /**
     * 删除data资源 例如structInfo fileInfo video
     */
    void deleteByFileIdsOrAtIds(String contentType, List<Integer> fileIds, List<String> atIds);

    void repushDeleteMongoData(String contentType, String columnName, Object value,
                               boolean deleteSource, String token);

    List<User> findUserList(String contentType);

    void deleteTopic(String topicName);

    void clearSourceCache(Source source);
}
